package main

import (
	"fmt"
	"gopkg.in/redis.v4"
	"time"
)

func main() {

}

// 创建 redis 客户端
func createClient() *redis.Client {
	client := redis.NewClient(&redis.Options{
		Addr:     "127.0.0.0:6379",
		Password: "",
		DB:       2,
	})

	// 通过 cient.Ping() 来检查是否成功连接到了 redis 服务器
	pong, err := client.Ping().Result()
	fmt.Println(pong, err)

	return client
}


// String 操作
func stringOperation(client *redis.Client) {
	// 第三个参数是过期时间, 如果是0, 则表示没有过期时间.
	err := client.Set("name", "xys", 0).Err()
	if err != nil {
		panic(err)
	}

	val, err := client.Get("name").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("name", val)


	// 这里设置过期时间.
	err = client.Set("age", "20", 1 * time.Second).Err()
	if err != nil {
		panic(err)
	}

	client.Incr("age") // 自增
	client.Incr("age") // 自增
	client.Decr("age") // 自减

	val, err = client.Get("age").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("age", val) // age 的值为21

	// 因为 key "age" 的过期时间是一秒钟, 因此当一秒后, 此 key 会自动被删除了.
	time.Sleep(1 * time.Second)
	val, err = client.Get("age").Result()
	if err != nil {
		// 因为 key "age" 已经过期了, 因此会有一个 redis: nil 的错误.
		fmt.Printf("error: %v\n", err)
	}
	fmt.Println("age", val)
}

//list操作
func listOperation(client *redis.Client) {
	client.RPush("fruit", "apple")               //在名称为fruit的list尾添加一个值为value的元素
	client.LPush("fruit", "banana")              //在名称为fruit的list头添加一个值为value的元素
	length, err := client.LLen("fruit").Result() //返回列表的长度
	if err != nil {
		panic(err)
	}
	fmt.Println("length:", length)

	value, err := client.LPop("fruit").Result() //返回并删除名称为furit的首元素
	if err != nil {
		panic(err)
	}
	fmt.Println("fruit:", value)
	value, err = client.RPop("fruit").Result() //返回并删除名称为fruit的尾元素
	if err != nil {
		panic(err)
	}
	fmt.Println("fruit:", value)
}

//set操作
func setOperation(client *redis.Client) {
	client.SAdd("blacklist", "Obama")     //向blanklist添加元素
	client.SAdd("blacklist", "Hillary")   //再次添加
	client.SAdd("blacklist", "the Elder") //添加新元素

	client.SAdd("whitelist", "the Elder") //向whitelist添加元素
	//判断元素是否在集合中
	isMember, err := client.SIsMember("blacklist", "Bush").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("Is Bush in blacklist:", isMember)
	//求交集，即既在黑名单中，又在白名单中
	names, err := client.SInter("blacklist", "whitelist").Result()
	if err != nil {
		panic(err)
	}
	//获取到的元素是the Elder
	fmt.Println("Inter reqult:", names)
	//获取指定集合所有元素
	all, err := client.SMembers("blacklist").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("All member:", all)
}

//hash操作
func hashOperation(client *redis.Client) {
	client.HSet("user_xys", "name", "xys") //向名称为user_xys的hash中添加元素name
	client.HSet("user_xys", "age", "18")   //向名称为user_xys的hash中添加元素age

	//批量地向名称为user_test的hash中天剑name和age
	client.HMSet("user_test", map[string]string{"name": "test", "age": "20"})
	//批量获取名为user_test的hash中的指定字段的值
	fields, err := client.HMGet("user_test", "name", "age").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("fields in user_test:", fields)

	//获取名为user_xys的hash中字段个数
	length, err := client.HLen("user_xys").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("field count in user_xys:", length) //字段个数

	//删除名为user_test的字段
	client.HDel("user_test", "age")
	age, err := client.HGet("user_tset", "age").Result()
	if err != nil {
		fmt.Printf("Get user_test age error:%v\n", err)
	} else {
		fmt.Println("user_test age is :", age) //字段个数为2
	}
}











